#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int studentNum = 0; 
struct addresslist {
    char name[20];   // 姓名
    char sex[10];    // 性别
    char phone[20];  // 手机号 
}student[100];
 
// 函数原型声明
int menu();
void end();
void save();
void enter();
void list(struct addresslist* p);
void input(struct addresslist* p, int n);
void find(struct addresslist* p);
void del(struct addresslist* p);
char returnToMenu(void);
void load (FILE* fp,int i);
// 主函数
int main() {
    int peopleNum;
    FILE *fp; 
    char chose;
 
    //主菜单
    do {
        switch (menu()) {
            case 1:
			                system("cls");
			                printf("请输入要录入的人数\n");
			                scanf("%d", &peopleNum);
			                while (peopleNum--) {
			                    enter();
			                }
			                save();
			                chose = returnToMenu();
			                break;
			case 2:
			                system("cls");
			                del(student);
			                chose = returnToMenu();
			                break;
			case 3:
                system("cls");
                list(student);
                chose = returnToMenu();
                break;
            case 4:
                system("cls");
                find(student);
                chose = returnToMenu();
                break;
            case 5:
            	system("cls");
            	void save();
            	chose = returnToMenu();
            	break;
            case 6:
            	system("cls");
            	load(fp,studentNum);
            	chose = returnToMenu();
            	break;
			case 7:
                end();
                break;
            default:
                printf("输入错误\n");
                chose = returnToMenu();
                break;
        }
    } while (chose != 'Y' && chose != 'y');
    if (chose == 'Y' || chose == 'y') {
        system("cls");
        end();
    }
 
    return 0;
}
 
//菜单
int menu() {
    int num;
    system("cls");
    printf("**********   学生通讯录   **********\n\n");
	printf("  ******       1. 录入      ******\n");
    printf("  ******       2. 删除      ******\n");
    printf("  ******       3. 显示      ******\n");
    printf("  ******       4. 查询      ******\n");
    printf("  ******       5. 保存      ******\n");
    printf("  ******       6. 加载      ******\n");
    printf("  ******       7. 退出      ******\n\n");
    printf("************************************\n");
    printf("请输入您想要进行的操作(1-7)：");
    fflush(stdin);//清除输入缓冲区
    scanf("%d", &num);
    return num;
}
 
// 保存数据到文件
void save() {
    int i;
    FILE *fp;
    if ((fp = fopen("通讯录.txt", "wb")) == NULL) {//打开文件 
        printf("文件打开失败\n");
        return;
    }
    for (i = 0; i < studentNum ; i++) {
        if (fwrite(&student[i], sizeof(struct addresslist), 1, fp) != 1) {
            printf("写入文件错误！\n");
        }
    }
    fclose(fp);
}
 
// 输出通讯录信息
void list(struct addresslist *p) {
    int i;
    for (i = 0; i < studentNum ; i++) {
        printf("姓名: %s\n", p[i].name);
        printf("性别: %s\n", p[i].sex);
        printf("手机号: %s\n", p[i].phone);
        printf("**********\n");
    }
}
 
 
void input(struct addresslist *p) {
    printf("请输入姓名：");
    scanf("%s", p->name);
    printf("请输入性别：");
    scanf("%s", p->sex);
    printf("请输入手机号：");
    scanf("%s", p->phone);
    printf("********** 录入完成！！！ **********\n");
}
 void enter() {
     input(&student[studentNum ]);
     studentNum++; // 更新学生人数
     save();
 }
// 查找学生信息
void find(struct addresslist *p) {
    int  i;
    char name2[20];
    printf("请输入您要查找的姓名：");
	fflush(stdin);
	scanf("%s", name2);
	for (i = 0; i < studentNum; i++) {
	if (strcmp(p[i].name, name2) == 0) {
	                    printf("姓名为%s的同学的信息如下：\n", name2);
	                    printf("姓名: %s\n", p[i].name);
	                    printf("性别: %s\n", p[i].sex);
	                    printf("手机号: %s\n", p[i].phone);
	                    break;
}}
}
// 删除学生信息
void del(struct addresslist *p){
    int  i, j;
    char name2[20];
    char choice;
    printf("请输入所要删除同学的姓名：");
    scanf("%s", name2);
    
    for (i = 0; i < studentNum; i++) {
        if (strcmp(p[i].name, name2) == 0){
            printf("\n姓名为%s的同学的资料如下：\n", name2);
            printf("性别: %s\n", p[i].sex);
            printf("手机号: %s\n", p[i].phone);
            printf("\n是否确定删除(Y/N)：");
            fflush(stdin);
            scanf("%c", &choice);
            
            if (choice == 'Y' || choice == 'y') {
                for (j = i; j < studentNum +- 1; j++) {
                    p[j] = p[j + 1]; // 删除该项并将后面的数据前移
                }
                studentNum--; // 更新学生人数
                save(); // 保存数据到文件
                printf("已成功删除该同学的信息。\n");
                break;
            } else {
                printf("已放弃删除操作。\n");
                break;
            }
        }}
    
    if (i == studentNum ) {
        printf("查无此人\n");
    }
}
void load(FILE* fp,int studentNum){
	    int i = studentNum;
		if ((fp = fopen("通讯录.txt", "rb")) == NULL) {
	        printf("文件打不开！\n");
	        exit(1);
	    }
	    while (!feof(fp)) {
	        fread(&student[i], sizeof(struct addresslist), 1, fp);
	        i++;
	    }
	    studentNum = i;
	    fclose(fp);
	
}


char returnToMenu(void) {
    char ch;
    printf("\n退出请按Y，其他键将返回菜单：");
    fflush(stdin);
    ch = getchar();
    return ch;
}
 
// 退出系统
void end() {
    printf("谢谢使用！\n");
    exit(0);
}
